package com.webank.openledger.contracts;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import com.webank.openledger.core.common.BaseIdentity;

import org.fisco.bcos.sdk.abi.FunctionEncoder;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicBytes;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.generated.Bytes32;
import org.fisco.bcos.sdk.abi.datatypes.generated.StaticArray4;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint256;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple3;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class Identity extends Contract implements BaseIdentity {
    public static final String[] BINARY_ARRAY = {"60806040526040805190810160405280600681526020017f7075626c6963000000000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200105b565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200105b565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060029080519060200190620000ed9291906200105b565b506040805190810160405280600281526020017f5f72000000000000000000000000000000000000000000000000000000000000815250600390805190602001906200013b9291906200105b565b506040805190810160405280600281526020017f5f7700000000000000000000000000000000000000000000000000000000000081525060049080519060200190620001899291906200105b565b506040805190810160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525060059080519060200190620001d79291906200105b565b506040805190810160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525060069080519060200190620002259291906200105b565b506040805190810160405280600481526020017f616464720000000000000000000000000000000000000000000000000000000081525060079080519060200190620002739291906200105b565b506040805190810160405280600481526020017f747970650000000000000000000000000000000000000000000000000000000081525060089080519060200190620002c19291906200105b565b506040805190810160405280600481526020017f726f6c6500000000000000000000000000000000000000000000000000000000815250600990805190602001906200030f9291906200105b565b506040805190810160405280600781526020017f7075625f6b657900000000000000000000000000000000000000000000000000815250600a90805190602001906200035d9291906200105b565b506040805190810160405280600481526020017f6461746100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620003ab9291906200105b565b506040805190810160405280600681526020017f726f6c655f720000000000000000000000000000000000000000000000000000815250600c9080519060200190620003f99291906200105b565b506040805190810160405280600681526020017f726f6c655f770000000000000000000000000000000000000000000000000000815250600d9080519060200190620004479291906200105b565b506040805190810160405280600c81526020017f6f70656e696e675f62616e6b0000000000000000000000000000000000000000815250600e9080519060200190620004959291906200105b565b506040805190810160405280600681526020017f6173736574730000000000000000000000000000000000000000000000000000815250600f9080519060200190620004e39291906200105b565b506040805190810160405280600781526020017f62616c616e63650000000000000000000000000000000000000000000000000081525060109080519060200190620005319291906200105b565b506040805190810160405280600681526020017f7265636f72640000000000000000000000000000000000000000000000000000815250601190805190602001906200057f9291906200105b565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060129080519060200190620005cd9291906200105b565b506040805190810160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250601390805190602001906200061b9291906200105b565b506040805190810160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525060149080519060200190620006699291906200105b565b506040805190810160405280600481526020017f757365720000000000000000000000000000000000000000000000000000000081525060159080519060200190620006b79291906200105b565b5062010001601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010002601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010003601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010004601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620007d557600080fd5b5060405160408062005dba8339810180604052620007f791908101906200129c565b60606200082e3073ffffffffffffffffffffffffffffffffffffffff1662000c03640100000000026200477c176401000000009004565b9050620008f460068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620008ce5780601f10620008a257610100808354040283529160200191620008ce565b820191906000526020600020905b815481529060010190602001808311620008b057829003601f168201915b505050505082601b62000ce76401000000000262002f9417909291906401000000009004565b5082601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3032be86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620009bd57600080fd5b505af1158015620009d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620009f8919081019062001270565b601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55fc52d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000abf57600080fd5b505af115801562000ad4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000afa919081019062001270565b602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151562000bb85781601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000bfa565b30601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505062001515565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f19166020018201604052801562000c4f5781602001602082028038833980820191505090505b509250600090505b601481101562000ce057818160148110151562000c7057fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151562000ca257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505062000c57565b5050919050565b60008084600001846040518082805190602001908083835b60208310151562000d26578051825260208201915060208101905060208303925062000cff565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111562000ee3577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151562000dff578051825260208201915060208101905060208303925062000dd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405162000e48959493929190620013f4565b60405180910390a18285600001856040518082805190602001908083835b60208310151562000e8d578051825260208201915060208101905060208303925062000e66565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000ed8929190620010e2565b506001915062001053565b8285600001856040518082805190602001908083835b60208310151562000f20578051825260208201915060208101905060208303925062000ef9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000f6b929190620010e2565b5084600101805480919060010162000f84919062001169565b90506001810185600001856040518082805190602001908083835b60208310151562000fc6578051825260208201915060208101905060208303925062000f9f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001819055","508385600101828154811015156200101357fe5b9060005260206000209060020201600001908051906020019062001039929190620010e2565b508460020160008154809291906001019190505550600091505b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200109e57805160ff1916838001178555620010cf565b82800160010185558215620010cf579182015b82811115620010ce578251825591602001919060010190620010b1565b5b509050620010de91906200119e565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200112557805160ff191683800117855562001156565b8280016001018555821562001156579182015b828111156200115557825182559160200191906001019062001138565b5b5090506200116591906200119e565b5090565b8154818355818111156200119957600202816002028360005260206000209182019101620011989190620011c6565b5b505050565b620011c391905b80821115620011bf576000816000905550600101620011a5565b5090565b90565b6200120b91905b80821115620012075760008082016000620011e991906200120e565b6001820160006101000a81549060ff021916905550600201620011cd565b5090565b90565b50805460018160011615610100020316600290046000825580601f1062001236575062001257565b601f0160209004906000526020600020908101906200125691906200119e565b5b50565b6000620012688251620014ae565b905092915050565b6000602082840312156200128357600080fd5b600062001293848285016200125a565b91505092915050565b60008060408385031215620012b057600080fd5b6000620012c0858286016200125a565b9250506020620012d3858286016200125a565b9150509250929050565b620012e8816200148e565b82525050565b6000620012fb8262001483565b80845262001311816020860160208601620014ce565b6200131c8162001504565b602085010191505092915050565b6000620013378262001478565b8084526200134d816020860160208601620014ce565b620013588162001504565b602085010191505092915050565b600081546001811660008114620013865760018114620013a757620013ec565b607f600283041680865260ff198316602087015260408601935050620013ec565b60028204808652602086019550620013bf8562001466565b60005b82811015620013e357815481890152600182019150602081019050620013c2565b80880195505050505b505092915050565b600060a0820190506200140b6000830188620012dd565b6200141a6020830187620012dd565b81810360408301526200142e81866200132a565b90508181036060830152620014448185620012ee565b905081810360808301526200145a818462001366565b90509695505050505050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620014ee578082015181840152602081019050620014d1565b83811115620014fe576000848401525b50505050565b6000601f19601f8301169050919050565b61489580620015256000396000f30060806040526004361061020f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301db8d891461021457806303ba71eb1461023f578063081f93391461026a5780630c0fd886146102955780630feca68a146102c0578063117803e3146102eb57806315e9977e1461031657806320ba5b601461034157806323a772bd1461037e578063283d26ca146103a95780632a0acc6a146103d45780632ef8cb1c146103ff578063391517531461042a5780633a0e6174146104555780633b007d8e146104805780635262e2a1146104bd57806357872d13146104e857806358edef4c14610513578063632e1dfe14610550578063699cc7f11461057b5780636adc4165146105a65780637bdd20b2146105d157806381e167cf1461060e5780638662acad14610639578063949d225d14610676578063983d2737146106a15780639d53fe2b146106cc578063a18c751e146106f7578063ac44522e14610734578063b11569f514610771578063b3032be81461079c578063b3cea217146107c7578063b4eb5ede146107f2578063b85a29011461081d578063bb1239c314610848578063bb24fe8a14610873578063c28304aa1461089e578063c55fc52d146108c9578063cb6163ad146108f4578063d087d28814610931578063d6d7d5251461095c578063e8c2553a14610999578063f307b32c146109d6575b600080fd5b34801561022057600080fd5b50610229610a01565b60405161023691906144bd565b60405180910390f35b34801561024b57600080fd5b50610254610a9f565b60405161026191906144bd565b60405180910390f35b34801561027657600080fd5b5061027f610b3d565b60405161028c91906144bd565b60405180910390f35b3480156102a157600080fd5b506102aa610bdb565b6040516102b791906144bd565b60405180910390f35b3480156102cc57600080fd5b506102d5610c79565b6040516102e291906145c1565b60405180910390f35b3480156102f757600080fd5b50610300610c9f565b60405161030d91906144bd565b60405180910390f35b34801561032257600080fd5b5061032b610d3d565b60405161033891906144bd565b60405180910390f35b34801561034d57600080fd5b5061036860048036036103639190810190613fb4565b610ddb565b60405161037591906144a2565b60405180910390f35b34801561038a57600080fd5b50610393610fd9565b6040516103a091906144bd565b60405180910390f35b3480156103b557600080fd5b506103be611077565b6040516103cb91906144bd565b60405180910390f35b3480156103e057600080fd5b506103e9611115565b6040516103f691906144bd565b60405180910390f35b34801561040b57600080fd5b506104146111b3565b60405161042191906144bd565b60405180910390f35b34801561043657600080fd5b5061043f611251565b60405161044c91906144bd565b60405180910390f35b34801561046157600080fd5b5061046a6112ef565b60405161047791906144bd565b60405180910390f35b34801561048c57600080fd5b506104a760048036036104a29190810190613fb4565b61138d565b6040516104b491906144a2565b60405180910390f35b3480156104c957600080fd5b506104d261158b565b6040516104df9190614371565b60405180910390f35b3480156104f457600080fd5b506104fd6115b5565b60405161050a91906144bd565b60405180910390f35b34801561051f57600080fd5b5061053a60048036036105359190810190613f1f565b611653565b60405161054791906144a2565b60405180910390f35b34801561055c57600080fd5b5061056561184e565b6040516105729190614371565b60405180910390f35b34801561058757600080fd5b50610590611874565b60405161059d91906144bd565b60405180910390f35b3480156105b257600080fd5b506105bb611912565b6040516105c89190614371565b60405180910390f35b3480156105dd57600080fd5b506105f860048036036105f39190810190613f60565b611938565b60405161060591906144a2565b60405180910390f35b34801561061a57600080fd5b50610623611b5b565b60405161063091906144bd565b60405180910390f35b34801561064557600080fd5b50610660600480360361065b9190810190613f60565b611bf9565b60405161066d91906144df565b60405180910390f35b34801561068257600080fd5b5061068b611e1b565b60405161069891906145c1565b60405180910390f35b3480156106ad57600080fd5b506106b6611e2c565b6040516106c391906144bd565b60405180910390f35b3480156106d857600080fd5b506106e1611eca565b6040516106ee91906144bd565b60405180910390f35b34801561070357600080fd5b5061071e60048036036107199190810190613fb4565b611f68565b60405161072b91906144a2565b60405180910390f35b34801561074057600080fd5b5061075b60048036036107569190810190614020565b612166565b60405161076891906144a2565b60405180910390f35b34801561077d57600080fd5b5061078661239e565b6040516107939190614371565b60405180910390f35b3480156107a857600080fd5b506107b16123c4565b6040516107be9190614371565b60405180910390f35b3480156107d357600080fd5b506107dc612489565b6040516107e991906144bd565b60405180910390f35b3480156107fe57600080fd5b50610807612527565b60405161081491906144bd565b60405180910390f35b34801561082957600080fd5b506108326125c5565b60405161083f91906144bd565b60405180910390f35b34801561085457600080fd5b5061085d612663565b60405161086a9190614371565b60405180910390f35b34801561087f57600080fd5b50610888612689565b60405161089591906144bd565b60405180910390f35b3480156108aa57600080fd5b506108b3612727565b6040516108c09190614371565b60405180910390f35b3480156108d557600080fd5b506108de612751565b6040516108eb9190614371565b60405180910390f35b34801561090057600080fd5b5061091b60048036036109169190810190614020565b612816565b60405161092891906144a2565b60405180910390f35b34801561093d57600080fd5b50610946612a4e565b60405161095391906145c1565b60405180910390f35b34801561096857600080fd5b50610983600480360361097e9190810190613f1f565b612a58565b60405161099091906144df565b60405180910390f35b3480156109a557600080fd5b506109c060048036036109bb9190810190614020565b612c53565b6040516109cd91906144a2565b60405180910390f35b3480156109e257600080fd5b506109eb612e8b565b6040516109f891906144bd565b60405180910390f35b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181","60011615610100020316600290048015610b355780601f10610b0a57610100808354040283529160200191610b35565b820191906000526020600020905b815481529060010190602001808311610b1857829003601f168201915b505050505081565b600d8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081565b600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c715780601f10610c4657610100808354040283529160200191610c71565b820191906000526020600020905b815481529060010190602001808311610c5457829003601f168201915b505050505081565b6000610c916001602154612f2990919063ffffffff16565b602181905550602154905090565b60148054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b505050505081565b60108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610dd35780601f10610da857610100808354040283529160200191610dd3565b820191906000526020600020905b815481529060010190602001808311610db657829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630610eed60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ed95780601f10610eae57610100808354040283529160200191610ed9565b820191906000526020600020905b815481529060010190602001808311610ebc57829003601f168201915b505050505089612f8090919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610f28949392919061438c565b602060405180830381600087803b158015610f4257600080fd5b505af1158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f7a9190810190613ef6565b1515610fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb290614581565b60405180910390fd5b610fd18383601b612f949092919063ffffffff16565b905092915050565b60118054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561106f5780601f106110445761010080835404028352916020019161106f565b820191906000526020600020905b81548152906001019060200180831161105257829003601f168201915b505050505081565b600a8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561110d5780601f106110e25761010080835404028352916020019161110d565b820191906000526020600020905b8154815290600101906020018083116110f057829003601f168201915b505050505081565b60128054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ab5780601f10611180576101008083540402835291602001916111ab565b820191906000526020600020905b81548152906001019060200180831161118e57829003601f168201915b505050505081565b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112495780601f1061121e57610100808354040283529160200191611249565b820191906000526020600020905b81548152906001019060200180831161122c57829003601f168201915b505050505081565b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112e75780601f106112bc576101008083540402835291602001916112e7565b820191906000526020600020905b8154815290600101906020018083116112ca57829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113855780601f1061135a57610100808354040283529160200191611385565b820191906000526020600020905b81548152906001019060200180831161136857829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061149f60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561148b5780601f106114605761010080835404028352916020019161148b565b820191906000526020600020905b81548152906001019060200180831161146e57829003601f168201915b505050505089612f8090919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016114da949392919061438c565b602060405180830381600087803b1580156114f457600080fd5b505af1158015611508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061152c9190810190613ef6565b151561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906145a1565b60405180910390fd5b6115838383601b6132f19092919063ffffffff16565b905092915050565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561164b5780601f106116205761010080835404028352916020019161164b565b820191906000526020600020905b81548152906001019060200180831161162e57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061176560048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b505050505088612f8090919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016117a0949392919061438c565b602060405180830381600087803b1580156117ba57600080fd5b505af11580156117ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117f29190810190613ef6565b1515611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614541565b60405180910390fd5b61184782601b6134e690919063ffffffff16565b9050919050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561190a5780601f106118df5761010080835404028352916020019161190a565b820191906000526020600020905b8154815290600101906020018083116118ed57829003601f168201915b505050505081565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060606000806119528684612f8090919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611a6360048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a4f5780601f10611a2457610100808354040283529160200191611a4f565b820191906000526020600020905b815481529060010190602001808311611a3257829003601f168201915b50505050508b612f8090919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611aa1959493929190614440565b6040805180830381600087803b158015611aba57600080fd5b505af1158015611ace573d6000803e3d6000fd5b505050506040513d601f1960","1f82011682018060405250611af29190810190613eba565b8092508193505050801515611b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3390614541565b60405180910390fd5b611b5086601b6134e690919063ffffffff16565b935050505092915050565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bf15780601f10611bc657610100808354040283529160200191611bf1565b820191906000526020600020905b815481529060010190602001808311611bd457829003601f168201915b505050505081565b606080600080611c128684612f8090919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611d2360038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d0f5780601f10611ce457610100808354040283529160200191611d0f565b820191906000526020600020905b815481529060010190602001808311611cf257829003601f168201915b50505050508b612f8090919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611d61959493929190614440565b6040805180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611db29190810190613eba565b8092508193505050801515611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614561565b60405180910390fd5b611e1086601b61373890919063ffffffff16565b935050505092915050565b6000611e27601b61384b565b905090565b60138054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611ec25780601f10611e9757610100808354040283529160200191611ec2565b820191906000526020600020905b815481529060010190602001808311611ea557829003601f168201915b505050505081565b60098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f605780601f10611f3557610100808354040283529160200191611f60565b820191906000526020600020905b815481529060010190602001808311611f4357829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061207a60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120665780601f1061203b57610100808354040283529160200191612066565b820191906000526020600020905b81548152906001019060200180831161204957829003601f168201915b505050505089612f8090919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016120b5949392919061438c565b602060405180830381600087803b1580156120cf57600080fd5b505af11580156120e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121079190810190613ef6565b1515612148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213f90614501565b60405180910390fd5b61215e8383601b6138599092919063ffffffff16565b905092915050565b60006060600080612192866121848986612f8090919063ffffffff16565b612f8090919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306122a360048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561228f5780601f106122645761010080835404028352916020019161228f565b820191906000526020600020905b81548152906001019060200180831161227257829003601f168201915b50505050508c612f8090919063ffffffff16565b878a6040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016122e1959493929190614440565b6040805180830381600087803b1580156122fa57600080fd5b505af115801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123329190810190613eba565b809250819350505080151561237c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612373906145a1565b60405180910390fd5b6123928787601b6132f19092919063ffffffff16565b93505050509392505050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b3032be86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561244c57600080fd5b505af1158015612460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506124849190810190613e91565b905090565b60068054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251f5780601f106124f45761010080835404028352916020019161251f565b820191906000526020600020905b81548152906001019060200180831161250257829003601f168201915b505050505081565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125bd5780601f10612592576101008083540402835291602001916125bd565b820191906000526020600020905b8154815290600101906020018083116125a057829003601f168201915b505050505081565b60008054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561265b5780601f106126305761010080835404028352916020019161265b565b820191906000526020600020905b81548152906001019060200180831161263e57829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561271f5780601f106126f45761010080835404028352916020019161271f565b820191906000526020600020905b81548152906001019060200180831161270257829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55fc52d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156127d957600080fd5b505af11580156127ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128119190810190613e91565b905090565b60006060600080612842866128348986612f8090919063ffffffff16565b612f8090919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061295360048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561293f5780601f106129145761010080835404028352916020019161293f565b820191906000526020600020905b81548152906001019060200180831161292257829003601f168201915b50505050508c612f8090919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612991959493929190614440565b6040805180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129e29190810190613eba565b8092508193505050801515612a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2390614581565b60405180910390fd5b612a428787601b612f949092919063ffffffff16565b93505050509392505050565b6000602154905090565b6060601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166337258c0d33601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630612b6a60038054600181600116156101000203166002900480601f0160","20809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b565780601f10612b2b57610100808354040283529160200191612b56565b820191906000526020600020905b815481529060010190602001808311612b3957829003601f168201915b505050505088612f8090919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612ba5949392919061438c565b602060405180830381600087803b158015612bbf57600080fd5b505af1158015612bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612bf79190810190613ef6565b1515612c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2f90614561565b60405180910390fd5b612c4c82601b61373890919063ffffffff16565b9050919050565b60006060600080612c7f86612c718986612f8090919063ffffffff16565b612f8090919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c04d4ef3601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630612d9060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d7c5780601f10612d5157610100808354040283529160200191612d7c565b820191906000526020600020905b815481529060010190602001808311612d5f57829003601f168201915b50505050508c612f8090919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612dce959493929190614440565b6040805180830381600087803b158015612de757600080fd5b505af1158015612dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e1f9190810190613eba565b8092508193505050801515612e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6090614501565b60405180910390fd5b612e7f8787601b6138599092919063ffffffff16565b93505050509392505050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f215780601f10612ef657610100808354040283529160200191612f21565b820191906000526020600020905b815481529060010190602001808311612f0457829003601f168201915b505050505081565b6000808284019050838110151515612f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6d90614521565b60405180910390fd5b8091505092915050565b6060612f8c8383613a56565b905092915050565b60008084600001846040518082805190602001908083835b602083101515612fd15780518252602082019150602081019050602083039250612fac565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613184577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b6020831015156130a75780518252602082019150602081019050602083039250613082565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516130ee9594939291906143d8565b60405180910390a18285600001856040518082805190602001908083835b602083101515613131578051825260208201915060208101905060208303925061310c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019061317a929190613c27565b50600191506132e9565b8285600001856040518082805190602001908083835b6020831015156131bf578051825260208201915060208101905060208303925061319a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001019080519060200190613208929190613c27565b5084600101805480919060010161321f9190613ca7565b90506001810185600001856040518082805190602001908083835b60208310151561325f578051825260208201915060208101905060208303925061323a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001819055508385600101828154811015156132ab57fe5b906000526020600020906002020160000190805190602001906132cf929190613c27565b508460020160008154809291906001019190505550600091505b509392505050565b60008084600001846040518082805190602001908083835b60208310151561332e5780518252602082019150602081019050602083039250613309565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111561337957600091506134de565b8285600001856040518082805190602001908083835b6020831015156133b4578051825260208201915060208101905060208303925061338f565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010190805190602001906133fd929190613c27565b508460010180548091906001016134149190613ca7565b90506001810185600001856040518082805190602001908083835b602083101515613454578051825260208201915060208101905060208303925061342f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001819055508385600101828154811015156134a057fe5b906000526020600020906002020160000190805190602001906134c4929190613c27565b508460020160008154809291906001019190505550600191505b509392505050565b60008083600001836040518082805190602001908083835b60208310151561352357805182526020820191506020810190506020830392506134fe565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081141561356e5760009150613731565b7f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f44454c45544500000000000000000000000000000000000000000000000000008152508688600001886040518082805190602001908083835b60208310151561360257805182526020820191506020810190506020830392506135dd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516136499594939291906143d8565b60405180910390a183600001836040518082805190602001908083835b60208310151561368b5780518252602082019150602081019050602083039250613666565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000808201600090556001820160006136d79190613cd9565b5050600184600101600183038154811015156136ef57fe5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550836002016000815480929190600190039190505550600191505b5092915050565b606082600001826040518082805190602001908083835b602083101515613774578051825260208201915060208101905060208303925061374f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561383e5780601f106138135761010080835404028352916020019161383e565b820191906000526020600020905b81548152906001019060200180831161382157829003601f168201915b5050505050905092915050565b600081600201549050919050565b60008084600001846040518082805190602001908083835b6020831015156138965780518252602082019150602081019050602083039250613871565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613a49577f77da9cffaff6366f6be90a928ae84ae14a77d3138ce236f9481aa71d15a9c47c32336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151561396c5780518252602082019150602081019050602083039250613947565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516139b39594939291906143d8565b60405180910390a18285600001856040518082805190602001908083835b6020831015156139f657805182526020820191506020810190506020830392506139d1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001019080519060200190613a3f929190613c27565b5060019150613a4e565b600091505b509392505050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613a9e5781602001602082028038833980820191505090505b50935083925060009150600090505b8551811015613b60578581815181101515613ac457fe5b9060200101517f010000000000000000000000000000","000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515613b2357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613aad565b600090505b8451811015613c18578481815181101515613b7c57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515613bdb57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613b65565b83965050505050505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c6857805160ff1916838001178555613c96565b82800160010185558215613c96579182015b82811115613c95578251825591602001919060010190613c7a565b5b509050613ca39190613d21565b5090565b815481835581811115613cd457600202816002028360005260206000209182019101613cd39190613d46565b5b505050565b50805460018160011615610100020316600290046000825580601f10613cff5750613d1e565b601f016020900490600052602060002090810190613d1d9190613d21565b5b50565b613d4391905b80821115613d3f576000816000905550600101613d27565b5090565b90565b613d8691905b80821115613d825760008082016000613d659190613cd9565b6001820160006101000a81549060ff021916905550600201613d4c565b5090565b90565b6000613d9582516146e1565b905092915050565b600082601f8301121515613db057600080fd5b6004613dc3613dbe82614609565b6145dc565b91508183856020840282011115613dd957600080fd5b60005b83811015613e095781613def8882613e27565b845260208401935060208301925050600181019050613ddc565b5050505092915050565b6000613e1f8251614701565b905092915050565b6000613e33823561470d565b905092915050565b600082601f8301121515613e4e57600080fd5b8135613e61613e5c8261462b565b6145dc565b91508082526020830160208301858383011115613e7d57600080fd5b613e88838284614729565b50505092915050565b600060208284031215613ea357600080fd5b6000613eb184828501613d89565b91505092915050565b60008060408385031215613ecd57600080fd5b6000613edb85828601613d89565b9250506020613eec85828601613e13565b9150509250929050565b600060208284031215613f0857600080fd5b6000613f1684828501613e13565b91505092915050565b600060208284031215613f3157600080fd5b600082013567ffffffffffffffff811115613f4b57600080fd5b613f5784828501613e3b565b91505092915050565b60008060a08385031215613f7357600080fd5b600083013567ffffffffffffffff811115613f8d57600080fd5b613f9985828601613e3b565b9250506020613faa85828601613d9d565b9150509250929050565b60008060408385031215613fc757600080fd5b600083013567ffffffffffffffff811115613fe157600080fd5b613fed85828601613e3b565b925050602083013567ffffffffffffffff81111561400a57600080fd5b61401685828601613e3b565b9150509250929050565b600080600060c0848603121561403557600080fd5b600084013567ffffffffffffffff81111561404f57600080fd5b61405b86828701613e3b565b935050602084013567ffffffffffffffff81111561407857600080fd5b61408486828701613e3b565b925050604061409586828701613d9d565b9150509250925092565b6140a8816146a1565b82525050565b6140b781614673565b6140c082614657565b60005b828110156140f2576140d6858351614108565b6140df82614694565b91506020850194506001810190506140c3565b5050505050565b614102816146c1565b82525050565b614111816146cd565b82525050565b600061412282614689565b808452614136816020860160208601614738565b61413f8161476b565b602085010191505092915050565b60006141588261467e565b80845261416c816020860160208601614738565b6141758161476b565b602085010191505092915050565b6000815460018116600081146141a057600181146141c057614201565b607f600283041680865260ff198316602087015260408601935050614201565b600282048086526020860195506141d685614661565b60005b828110156141f8578154818901526001820191506020810190506141d9565b80880195505050505b505092915050565b61421281614717565b82525050565b6000600e82527f73657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601b82527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006020830152604082019050919050565b6000601182527f72656d6f766520466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b6000600e82527f67657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601182527f696e7365727420466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b6000600e82527f61646420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b61436b816146d7565b82525050565b6000602082019050614386600083018461409f565b92915050565b60006080820190506143a1600083018761409f565b6143ae602083018661409f565b6143bb604083018561409f565b81810360608301526143cd8184614117565b905095945050505050565b600060a0820190506143ed600083018861409f565b6143fa602083018761409f565b818103604083015261440c818661414d565b905081810360608301526144208185614117565b905081810360808301526144348184614183565b90509695505050505050565b600061010082019050614456600083018861409f565b6144636020830187614209565b81810360408301526144758186614117565b905081810360608301526144898185614117565b905061449860808301846140ae565b9695505050505050565b60006020820190506144b760008301846140f9565b92915050565b600060208201905081810360008301526144d7818461414d565b905092915050565b600060208201905081810360008301526144f98184614117565b905092915050565b6000602082019050818103600083015261451a81614218565b9050919050565b6000602082019050818103600083015261453a8161424f565b9050919050565b6000602082019050818103600083015261455a81614286565b9050919050565b6000602082019050818103600083015261457a816142bd565b9050919050565b6000602082019050818103600083015261459a816142f4565b9050919050565b600060208201905081810360008301526145ba8161432b565b9050919050565b60006020820190506145d66000830184614362565b92915050565b6000604051905081810181811067ffffffffffffffff821117156145ff57600080fd5b8060405250919050565b600067ffffffffffffffff82111561462057600080fd5b602082029050919050565b600067ffffffffffffffff82111561464257600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b60008160005260206000209050919050565b600060049050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000614722826146a1565b9050919050565b82818337600083830152505050565b60005b8381101561475657808201518184015260208101905061473b565b83811115614765576000848401525b50505050565b6000601f19601f8301169050919050565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f1916602001820160405280156147c75781602001602082028038833980820191505090505b509250600090505b60148110156148545781816014811015156147e657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151561481757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506147cf565b50509190505600a265627a7a7230582087dba24eeb0936b02f84612a8dad0cb6db7b0e8c998ff8d688f1cd98638a22fc6c6578706572696d656e74616cf50037"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"60806040526040805190810160405280600681526020017f7075626c6963000000000000000000000000000000000000000000000000000081525060009080519060200190620000519291906200105b565b506040805190810160405280600581526020017f6f776e6572000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200105b565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060029080519060200190620000ed9291906200105b565b506040805190810160405280600281526020017f5f72000000000000000000000000000000000000000000000000000000000000815250600390805190602001906200013b9291906200105b565b506040805190810160405280600281526020017f5f7700000000000000000000000000000000000000000000000000000000000081525060049080519060200190620001899291906200105b565b506040805190810160405280600381526020017f616c6c000000000000000000000000000000000000000000000000000000000081525060059080519060200190620001d79291906200105b565b506040805190810160405280600281526020017f696400000000000000000000000000000000000000000000000000000000000081525060069080519060200190620002259291906200105b565b506040805190810160405280600481526020017f616464720000000000000000000000000000000000000000000000000000000081525060079080519060200190620002739291906200105b565b506040805190810160405280600481526020017f747970650000000000000000000000000000000000000000000000000000000081525060089080519060200190620002c19291906200105b565b506040805190810160405280600481526020017f726f6c6500000000000000000000000000000000000000000000000000000000815250600990805190602001906200030f9291906200105b565b506040805190810160405280600781526020017f7075625f6b657900000000000000000000000000000000000000000000000000815250600a90805190602001906200035d9291906200105b565b506040805190810160405280600481526020017f6461746100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620003ab9291906200105b565b506040805190810160405280600681526020017f726f6c655f720000000000000000000000000000000000000000000000000000815250600c9080519060200190620003f99291906200105b565b506040805190810160405280600681526020017f726f6c655f770000000000000000000000000000000000000000000000000000815250600d9080519060200190620004479291906200105b565b506040805190810160405280600c81526020017f6f70656e696e675f62616e6b0000000000000000000000000000000000000000815250600e9080519060200190620004959291906200105b565b506040805190810160405280600681526020017f6173736574730000000000000000000000000000000000000000000000000000815250600f9080519060200190620004e39291906200105b565b506040805190810160405280600781526020017f62616c616e63650000000000000000000000000000000000000000000000000081525060109080519060200190620005319291906200105b565b506040805190810160405280600681526020017f7265636f72640000000000000000000000000000000000000000000000000000815250601190805190602001906200057f9291906200105b565b506040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525060129080519060200190620005cd9291906200105b565b506040805190810160405280600881526020017f6f70657261746f72000000000000000000000000000000000000000000000000815250601390805190602001906200061b9291906200105b565b506040805190810160405280600581526020017f6f776e657200000000000000000000000000000000000000000000000000000081525060149080519060200190620006699291906200105b565b506040805190810160405280600481526020017f757365720000000000000000000000000000000000000000000000000000000081525060159080519060200190620006b79291906200105b565b5062010001601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010002601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010003601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062010004601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620007d557600080fd5b5060405160408062005dba8339810180604052620007f791908101906200129c565b60606200082e3073ffffffffffffffffffffffffffffffffffffffff1662000c03640100000000026200477c176401000000009004565b9050620008f460068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620008ce5780601f10620008a257610100808354040283529160200191620008ce565b820191906000526020600020905b815481529060010190602001808311620008b057829003601f168201915b505050505082601b62000ce764010000000002620032a417909291906401000000009004565b5082601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e92139da6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620009bd57600080fd5b505af1158015620009d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620009f8919081019062001270565b601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631500025a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000abf57600080fd5b505af115801562000ad4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000afa919081019062001270565b602060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151562000bb85781601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000bfa565b30601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505062001515565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f19166020018201604052801562000c4f5781602001602082028038833980820191505090505b509250600090505b601481101562000ce057818160148110151562000c7057fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151562000ca257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505062000c57565b5050919050565b60008084600001846040518082805190602001908083835b60208310151562000d26578051825260208201915060208101905060208303925062000cff565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001549050600081111562000ee3577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b60208310151562000dff578051825260208201915060208101905060208303925062000dd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060010160405162000e48959493929190620013f4565b60405180910390a18285600001856040518082805190602001908083835b60208310151562000e8d578051825260208201915060208101905060208303925062000e66565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000ed8929190620010e2565b506001915062001053565b8285600001856040518082805190602001908083835b60208310151562000f20578051825260208201915060208101905060208303925062000ef9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019062000f6b929190620010e2565b5084600101805480919060010162000f84919062001169565b90506001810185600001856040518082805190602001908083835b60208310151562000fc6578051825260208201915060208101905060208303925062000f9f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001819055","508385600101828154811015156200101357fe5b9060005260206000209060020201600001908051906020019062001039929190620010e2565b508460020160008154809291906001019190505550600091505b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200109e57805160ff1916838001178555620010cf565b82800160010185558215620010cf579182015b82811115620010ce578251825591602001919060010190620010b1565b5b509050620010de91906200119e565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200112557805160ff191683800117855562001156565b8280016001018555821562001156579182015b828111156200115557825182559160200191906001019062001138565b5b5090506200116591906200119e565b5090565b8154818355818111156200119957600202816002028360005260206000209182019101620011989190620011c6565b5b505050565b620011c391905b80821115620011bf576000816000905550600101620011a5565b5090565b90565b6200120b91905b80821115620012075760008082016000620011e991906200120e565b6001820160006101000a81549060ff021916905550600201620011cd565b5090565b90565b50805460018160011615610100020316600290046000825580601f1062001236575062001257565b601f0160209004906000526020600020908101906200125691906200119e565b5b50565b6000620012688251620014ae565b905092915050565b6000602082840312156200128357600080fd5b600062001293848285016200125a565b91505092915050565b60008060408385031215620012b057600080fd5b6000620012c0858286016200125a565b9250506020620012d3858286016200125a565b9150509250929050565b620012e8816200148e565b82525050565b6000620012fb8262001483565b80845262001311816020860160208601620014ce565b6200131c8162001504565b602085010191505092915050565b6000620013378262001478565b8084526200134d816020860160208601620014ce565b620013588162001504565b602085010191505092915050565b600081546001811660008114620013865760018114620013a757620013ec565b607f600283041680865260ff198316602087015260408601935050620013ec565b60028204808652602086019550620013bf8562001466565b60005b82811015620013e357815481890152600182019150602081019050620013c2565b80880195505050505b505092915050565b600060a0820190506200140b6000830188620012dd565b6200141a6020830187620012dd565b81810360408301526200142e81866200132a565b90508181036060830152620014448185620012ee565b905081810360808301526200145a818462001366565b90509695505050505050565b60008160005260206000209050919050565b600081519050919050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620014ee578082015181840152602081019050620014d1565b83811115620014fe576000848401525b50505050565b6000601f19601f8301169050919050565b61489580620015256000396000f30060806040526004361061020f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630bc95c79146102145780630c9481b91461023f578063112da3031461026a5780631500025a146102955780631a1f1cd2146102c05780633055ae81146102eb57806342033801146103285780634425c4261461035357806347a6caff1461037e57806351cf7708146103bb578063567f2836146103f85780635c7540bc146104235780635edfd6fa1461044e5780635f12ec2e1461047957806361e020cb146104a457806367e09af5146104e157806374b00d531461050c578063769fe342146105375780637e3a1ef4146105625780637e6f287c1461058d5780637f00af97146105ca5780638a4451f5146105f55780638ed13ef514610620578063980683641461065d578063a4fd771114610688578063ad07c37a146106c5578063b09a50fe14610702578063b32941d81461072d578063bcc6cdb614610758578063bced953514610783578063bfabb86d146107ae578063c03fd5e7146107d9578063c6125d0c14610804578063d1281a781461082f578063d3e9af5a1461085a578063d617f06d14610885578063d7e7948f146108b0578063e3fbfc3f146108db578063e92139da14610918578063ece272e314610943578063ee19b0cf1461096e578063f6cb4bc514610999578063f9766994146109c4575b600080fd5b34801561022057600080fd5b50610229610a01565b6040516102369190614371565b60405180910390f35b34801561024b57600080fd5b50610254610a27565b60405161026191906144bd565b60405180910390f35b34801561027657600080fd5b5061027f610ac5565b60405161028c91906144bd565b60405180910390f35b3480156102a157600080fd5b506102aa610b63565b6040516102b79190614371565b60405180910390f35b3480156102cc57600080fd5b506102d5610c28565b6040516102e291906144bd565b60405180910390f35b3480156102f757600080fd5b50610312600480360361030d9190810190613f1f565b610cc6565b60405161031f91906144df565b60405180910390f35b34801561033457600080fd5b5061033d610ec1565b60405161034a91906144bd565b60405180910390f35b34801561035f57600080fd5b50610368610f5f565b60405161037591906145c1565b60405180910390f35b34801561038a57600080fd5b506103a560048036036103a09190810190614020565b610f85565b6040516103b291906144a2565b60405180910390f35b3480156103c757600080fd5b506103e260048036036103dd9190810190614020565b6111bd565b6040516103ef91906144a2565b60405180910390f35b34801561040457600080fd5b5061040d6113f5565b60405161041a91906145c1565b60405180910390f35b34801561042f57600080fd5b506104386113ff565b6040516104459190614371565b60405180910390f35b34801561045a57600080fd5b50610463611429565b60405161047091906144bd565b60405180910390f35b34801561048557600080fd5b5061048e6114c7565b60405161049b9190614371565b60405180910390f35b3480156104b057600080fd5b506104cb60048036036104c69190810190613fb4565b6114f1565b6040516104d891906144a2565b60405180910390f35b3480156104ed57600080fd5b506104f66116ef565b60405161050391906144bd565b60405180910390f35b34801561051857600080fd5b5061052161178d565b60405161052e9190614371565b60405180910390f35b34801561054357600080fd5b5061054c6117b3565b60405161055991906144bd565b60405180910390f35b34801561056e57600080fd5b50610577611851565b60405161058491906144bd565b60405180910390f35b34801561059957600080fd5b506105b460048036036105af9190810190613f1f565b6118ef565b6040516105c191906144a2565b60405180910390f35b3480156105d657600080fd5b506105df611aea565b6040516105ec91906144bd565b60405180910390f35b34801561060157600080fd5b5061060a611b88565b6040516106179190614371565b60405180910390f35b34801561062c57600080fd5b5061064760048036036106429190810190614020565b611bae565b60405161065491906144a2565b60405180910390f35b34801561066957600080fd5b50610672611de6565b60405161067f91906144bd565b60405180910390f35b34801561069457600080fd5b506106af60048036036106aa9190810190613fb4565b611e84565b6040516106bc91906144a2565b60405180910390f35b3480156106d157600080fd5b506106ec60048036036106e79190810190613fb4565b612082565b6040516106f991906144a2565b60405180910390f35b34801561070e57600080fd5b50610717612280565b60405161072491906144bd565b60405180910390f35b34801561073957600080fd5b5061074261231e565b60405161074f91906144bd565b60405180910390f35b34801561076457600080fd5b5061076d6123bc565b60405161077a91906144bd565b60405180910390f35b34801561078f57600080fd5b5061079861245a565b6040516107a591906144bd565b60405180910390f35b3480156107ba57600080fd5b506107c36124f8565b6040516107d091906144bd565b60405180910390f35b3480156107e557600080fd5b506107ee612596565b6040516107fb9190614371565b60405180910390f35b34801561081057600080fd5b506108196125bc565b60405161082691906144bd565b60405180910390f35b34801561083b57600080fd5b5061084461265a565b60405161085191906144bd565b60405180910390f35b34801561086657600080fd5b5061086f6126f8565b60405161087c91906145c1565b60405180910390f35b34801561089157600080fd5b5061089a612709565b6040516108a791906144bd565b60405180910390f35b3480156108bc57600080fd5b506108c56127a7565b6040516108d291906144bd565b60405180910390f35b3480156108e757600080fd5b5061090260048036036108fd9190810190613f60565b612845565b60405161090f91906144a2565b60405180910390f35b34801561092457600080fd5b5061092d612a68565b60405161093a9190614371565b60405180910390f35b34801561094f57600080fd5b50610958612b2d565b60405161096591906144bd565b60405180910390f35b34801561097a57600080fd5b50610983612bcb565b60405161099091906144bd565b60405180910390f35b3480156109a557600080fd5b506109ae612c69565b6040516109bb91906144bd565b60405180910390f35b3480156109d057600080fd5b506109eb60048036036109e69190810190613f60565b612d07565b6040516109f891906144df565b60405180910390f35b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610abd5780601f10610a9257610100808354040283529160200191610abd565b820191906000526020600020905b815481529060010190602001808311610aa057829003601f168201915b505050505081565b600280546001816001161561010002031660029004","80601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b5b5780601f10610b3057610100808354040283529160200191610b5b565b820191906000526020600020905b815481529060010190602001808311610b3e57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631500025a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610beb57600080fd5b505af1158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610c239190810190613e91565b905090565b60158054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cbe5780601f10610c9357610100808354040283529160200191610cbe565b820191906000526020600020905b815481529060010190602001808311610ca157829003601f168201915b505050505081565b6060601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630610dd860038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610dc45780601f10610d9957610100808354040283529160200191610dc4565b820191906000526020600020905b815481529060010190602001808311610da757829003601f168201915b505050505088612f2990919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610e13949392919061438c565b602060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e659190810190613ef6565b1515610ea6576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401610e9d90614541565b60405180910390fd5b610eba82601b612f3d90919063ffffffff16565b9050919050565b60138054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f575780601f10610f2c57610100808354040283529160200191610f57565b820191906000526020600020905b815481529060010190602001808311610f3a57829003601f168201915b505050505081565b6000610f77600160215461305090919063ffffffff16565b602181905550602154905090565b60006060600080610fb186610fa38986612f2990919063ffffffff16565b612f2990919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306110c260048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110ae5780601f10611083576101008083540402835291602001916110ae565b820191906000526020600020905b81548152906001019060200180831161109157829003601f168201915b50505050508c612f2990919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611100959493929190614440565b6040805180830381600087803b15801561111957600080fd5b505af115801561112d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111519190810190613eba565b809250819350505080151561119b576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161119290614561565b60405180910390fd5b6111b18787601b6130a79092919063ffffffff16565b93505050509392505050565b600060606000806111e9866111db8986612f2990919063ffffffff16565b612f2990919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306112fa60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112e65780601f106112bb576101008083540402835291602001916112e6565b820191906000526020600020905b8154815290600101906020018083116112c957829003601f168201915b50505050508c612f2990919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611338959493929190614440565b6040805180830381600087803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113899190810190613eba565b80925081935050508015156113d3576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016113ca90614581565b60405180910390fd5b6113e98787601b6132a49092919063ffffffff16565b93505050509392505050565b6000602154905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b505050505081565b6000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061160360048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115ef5780601f106115c4576101008083540402835291602001916115ef565b820191906000526020600020905b8154815290600101906020018083116115d257829003601f168201915b505050505089612f2990919063ffffffff16565b6040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161163e949392919061438c565b602060405180830381600087803b15801561165857600080fd5b505af115801561166c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116909190810190613ef6565b15156116d1576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016116c890614581565b60405180910390fd5b6116e78383601b6132a49092919063ffffffff16565b905092915050565b600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117855780601f1061175a57610100808354040283529160200191611785565b820191906000526020600020905b81548152906001019060200180831161176857829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118495780601f1061181e57610100808354040283529160200191611849565b820191906000526020600020905b81548152906001019060200180831161182c57829003601f168201915b505050505081565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118e75780601f106118bc576101008083540402835291602001916118e7565b820191906000526020600020905b8154815290600101906020018083116118ca57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611a0160048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119ed5780601f106119c2576101008083540402835291602001916119ed565b820191906000526020600020905b8154815290600101906020018083116119d057829003601f168201915b505050505088612f2990919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611a3c949392919061438c565b602060405180830381600087803b158015611a5657600080fd5b505af1158015611a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a8e9190810190613ef6565b1515611acf576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401611ac6906145a1565b60405180910390fd5b611ae382601b6136019091","9063ffffffff16565b9050919050565b60088054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b805780601f10611b5557610100808354040283529160200191611b80565b820191906000526020600020905b815481529060010190602001808311611b6357829003601f168201915b505050505081565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600080611bda86611bcc8986612f2990919063ffffffff16565b612f2990919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611ceb60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611cd75780601f10611cac57610100808354040283529160200191611cd7565b820191906000526020600020905b815481529060010190602001808311611cba57829003601f168201915b50505050508c612f2990919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611d29959493929190614440565b6040805180830381600087803b158015611d4257600080fd5b505af1158015611d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d7a9190810190613eba565b8092508193505050801515611dc4576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401611dbb90614501565b60405180910390fd5b611dda8787601b6138539092919063ffffffff16565b93505050509392505050565b60078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e7c5780601f10611e5157610100808354040283529160200191611e7c565b820191906000526020600020905b815481529060010190602001808311611e5f57829003601f168201915b505050505081565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630611f9660048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f825780601f10611f5757610100808354040283529160200191611f82565b820191906000526020600020905b815481529060010190602001808311611f6557829003601f168201915b505050505089612f2990919063ffffffff16565b6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611fd1949392919061438c565b602060405180830381600087803b158015611feb57600080fd5b505af1158015611fff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506120239190810190613ef6565b1515612064576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161205b90614501565b60405180910390fd5b61207a8383601b6138539092919063ffffffff16565b905092915050565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638d478f2933601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061219460048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121805780601f1061215557610100808354040283529160200191612180565b820191906000526020600020905b81548152906001019060200180831161216357829003601f168201915b505050505089612f2990919063ffffffff16565b6040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016121cf949392919061438c565b602060405180830381600087803b1580156121e957600080fd5b505af11580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122219190810190613ef6565b1515612262576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161225990614561565b60405180910390fd5b6122788383601b6130a79092919063ffffffff16565b905092915050565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b505050505081565b60148054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123b45780601f10612389576101008083540402835291602001916123b4565b820191906000526020600020905b81548152906001019060200180831161239757829003601f168201915b505050505081565b60128054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124525780601f1061242757610100808354040283529160200191612452565b820191906000526020600020905b81548152906001019060200180831161243557829003601f168201915b505050505081565b60118054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124f05780601f106124c5576101008083540402835291602001916124f0565b820191906000526020600020905b8154815290600101906020018083116124d357829003601f168201915b505050505081565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561258e5780601f106125635761010080835404028352916020019161258e565b820191906000526020600020905b81548152906001019060200180831161257157829003601f168201915b505050505081565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126525780601f1061262757610100808354040283529160200191612652565b820191906000526020600020905b81548152906001019060200180831161263557829003601f168201915b505050505081565b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126f05780601f106126c5576101008083540402835291602001916126f0565b820191906000526020600020905b8154815290600101906020018083116126d357829003601f168201915b505050505081565b6000612704601b613a48565b905090565b600c8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561279f5780601f106127745761010080835404028352916020019161279f565b820191906000526020600020905b81548152906001019060200180831161278257829003601f168201915b505050505081565b60108054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561283d5780601f106128125761010080835404028352916020019161283d565b820191906000526020600020905b81548152906001019060200180831161282057829003601f168201915b505050505081565b6000606060008061285f8684612f2990919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163061297060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561295c5780601f106129315761010080835404028352916020019161295c565b820191906000526020600020905b81548152906001019060200180831161293f57829003601f168201915b50505050508b612f2990919063ffffffff16565b878a6040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016129ae959493929190614440565b6040805180830381600087803b1580156129c757600080fd5b505af11580156129db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129ff9190810190613eba565b8092508193505050801515612a49576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612a40906145a1565b60405180910390fd5b612a5d86601b61360190919063ffffffff16565b935050505092915050565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e92139da6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040","5180830381600087803b158015612af057600080fd5b505af1158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b289190810190613e91565b905090565b600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612bc35780601f10612b9857610100808354040283529160200191612bc3565b820191906000526020600020905b815481529060010190602001808311612ba657829003601f168201915b505050505081565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c615780601f10612c3657610100808354040283529160200191612c61565b820191906000526020600020905b815481529060010190602001808311612c4457829003601f168201915b505050505081565b600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cff5780601f10612cd457610100808354040283529160200191612cff565b820191906000526020600020905b815481529060010190602001808311612ce257829003601f168201915b505050505081565b606080600080612d208684612f2990919063ffffffff16565b9250601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cfe3b125601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630612e3160038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e1d5780601f10612df257610100808354040283529160200191612e1d565b820191906000526020600020905b815481529060010190602001808311612e0057829003601f168201915b50505050508b612f2990919063ffffffff16565b878a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612e6f959493929190614440565b6040805180830381600087803b158015612e8857600080fd5b505af1158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ec09190810190613eba565b8092508193505050801515612f0a576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612f0190614541565b60405180910390fd5b612f1e86601b612f3d90919063ffffffff16565b935050505092915050565b6060612f358383613a56565b905092915050565b606082600001826040518082805190602001908083835b602083101515612f795780518252602082019150602081019050602083039250612f54565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130435780601f1061301857610100808354040283529160200191613043565b820191906000526020600020905b81548152906001019060200180831161302657829003601f168201915b5050505050905092915050565b600080828401905083811015151561309d576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161309490614521565b60405180910390fd5b8091505092915050565b60008084600001846040518082805190602001908083835b6020831015156130e457805182526020820191506020810190506020830392506130bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613297577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b6020831015156131ba5780518252602082019150602081019050602083039250613195565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516132019594939291906143d8565b60405180910390a18285600001856040518082805190602001908083835b602083101515613244578051825260208201915060208101905060208303925061321f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019061328d929190613c27565b506001915061329c565b600091505b509392505050565b60008084600001846040518082805190602001908083835b6020831015156132e157805182526020820191506020810190506020830392506132bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811115613494577fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f4d4f4449465900000000000000000000000000000000000000000000000000008152508789600001896040518082805190602001908083835b6020831015156133b75780518252602082019150602081019050602083039250613392565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516133fe9594939291906143d8565b60405180910390a18285600001856040518082805190602001908083835b602083101515613441578051825260208201915060208101905060208303925061341c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019061348a929190613c27565b50600191506135f9565b8285600001856040518082805190602001908083835b6020831015156134cf57805182526020820191506020810190506020830392506134aa565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001019080519060200190613518929190613c27565b5084600101805480919060010161352f9190613ca7565b90506001810185600001856040518082805190602001908083835b60208310151561356f578051825260208201915060208101905060208303925061354a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600001819055508385600101828154811015156135bb57fe5b906000526020600020906002020160000190805190602001906135df929190613c27565b508460020160008154809291906001019190505550600091505b509392505050565b60008083600001836040518082805190602001908083835b60208310151561363e5780518252602082019150602081019050602083039250613619565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000015490506000811415613689576000915061384c565b7fb842e70165ea1827273bc7a4271b485c64a747bd35bd7b804c41256bf4d5ecf132336040805190810160405280600681526020017f44454c45544500000000000000000000000000000000000000000000000000008152508688600001886040518082805190602001908083835b60208310151561371d57805182526020820191506020810190506020830392506136f8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001016040516137649594939291906143d8565b60405180910390a183600001836040518082805190602001908083835b6020831015156137a65780518252602082019150602081019050602083039250613781565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000808201600090556001820160006137f29190613cd9565b50506001846001016001830381548110151561380a57fe5b906000526020600020906002020160010160006101000a81548160ff021916908315150217905550836002016000815480929190600190039190505550600191505b5092915050565b60008084600001846040518082805190602001908083835b602083101515613890578051825260208201915060208101905060208303925061386b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000154905060008111156138db5760009150613a40565b8285600001856040518082805190602001908083835b60208310151561391657805182526020820191506020810190506020830392506138f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600101908051906020019061395f929190613c27565b508460010180548091906001016139769190613ca7565b90506001810185600001856040518082805190602001908083835b6020831015156139b65780518252602082019150602081019050602083039250613991565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000181905550838560010182815481101515613a0257fe5b90600052602060002090600202016000019080519060200190613a26929190613c27565b508460020160008154809291906001019190505550600191505b509392505050565b600081600201549050919050565b606080606080606060008088955087945084518651016040519080825280601f01601f191660200182016040528015613a9e5781602001602082028038833980820191505090505b50935083925060009150600090505b8551811015613b60578581815181101515613ac457fe5b9060200101517f010000000000000000000000000000","000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515613b2357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613aad565b600090505b8451811015613c18578481815181101515613b7c57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028383806001019450815181101515613bdb57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613b65565b83965050505050505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c6857805160ff1916838001178555613c96565b82800160010185558215613c96579182015b82811115613c95578251825591602001919060010190613c7a565b5b509050613ca39190613d21565b5090565b815481835581811115613cd457600202816002028360005260206000209182019101613cd39190613d46565b5b505050565b50805460018160011615610100020316600290046000825580601f10613cff5750613d1e565b601f016020900490600052602060002090810190613d1d9190613d21565b5b50565b613d4391905b80821115613d3f576000816000905550600101613d27565b5090565b90565b613d8691905b80821115613d825760008082016000613d659190613cd9565b6001820160006101000a81549060ff021916905550600201613d4c565b5090565b90565b6000613d9582516146e1565b905092915050565b600082601f8301121515613db057600080fd5b6004613dc3613dbe82614609565b6145dc565b91508183856020840282011115613dd957600080fd5b60005b83811015613e095781613def8882613e27565b845260208401935060208301925050600181019050613ddc565b5050505092915050565b6000613e1f8251614701565b905092915050565b6000613e33823561470d565b905092915050565b600082601f8301121515613e4e57600080fd5b8135613e61613e5c8261462b565b6145dc565b91508082526020830160208301858383011115613e7d57600080fd5b613e88838284614729565b50505092915050565b600060208284031215613ea357600080fd5b6000613eb184828501613d89565b91505092915050565b60008060408385031215613ecd57600080fd5b6000613edb85828601613d89565b9250506020613eec85828601613e13565b9150509250929050565b600060208284031215613f0857600080fd5b6000613f1684828501613e13565b91505092915050565b600060208284031215613f3157600080fd5b600082013567ffffffffffffffff811115613f4b57600080fd5b613f5784828501613e3b565b91505092915050565b60008060a08385031215613f7357600080fd5b600083013567ffffffffffffffff811115613f8d57600080fd5b613f9985828601613e3b565b9250506020613faa85828601613d9d565b9150509250929050565b60008060408385031215613fc757600080fd5b600083013567ffffffffffffffff811115613fe157600080fd5b613fed85828601613e3b565b925050602083013567ffffffffffffffff81111561400a57600080fd5b61401685828601613e3b565b9150509250929050565b600080600060c0848603121561403557600080fd5b600084013567ffffffffffffffff81111561404f57600080fd5b61405b86828701613e3b565b935050602084013567ffffffffffffffff81111561407857600080fd5b61408486828701613e3b565b925050604061409586828701613d9d565b9150509250925092565b6140a8816146a1565b82525050565b6140b781614673565b6140c082614657565b60005b828110156140f2576140d6858351614108565b6140df82614694565b91506020850194506001810190506140c3565b5050505050565b614102816146c1565b82525050565b614111816146cd565b82525050565b600061412282614689565b808452614136816020860160208601614738565b61413f8161476b565b602085010191505092915050565b60006141588261467e565b80845261416c816020860160208601614738565b6141758161476b565b602085010191505092915050565b6000815460018116600081146141a057600181146141c057614201565b607f600283041680865260ff198316602087015260408601935050614201565b600282048086526020860195506141d685614661565b60005b828110156141f8578154818901526001820191506020810190506141d9565b80880195505050505b505092915050565b61421281614717565b82525050565b6000600e82527f61646420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601b82527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006020830152604082019050919050565b6000600e82527f67657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000600e82527f73657420466f7262696464656e210000000000000000000000000000000000006020830152604082019050919050565b6000601182527f696e7365727420466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b6000601182527f72656d6f766520466f7262696464656e210000000000000000000000000000006020830152604082019050919050565b61436b816146d7565b82525050565b6000602082019050614386600083018461409f565b92915050565b60006080820190506143a1600083018761409f565b6143ae602083018661409f565b6143bb604083018561409f565b81810360608301526143cd8184614117565b905095945050505050565b600060a0820190506143ed600083018861409f565b6143fa602083018761409f565b818103604083015261440c818661414d565b905081810360608301526144208185614117565b905081810360808301526144348184614183565b90509695505050505050565b600061010082019050614456600083018861409f565b6144636020830187614209565b81810360408301526144758186614117565b905081810360608301526144898185614117565b905061449860808301846140ae565b9695505050505050565b60006020820190506144b760008301846140f9565b92915050565b600060208201905081810360008301526144d7818461414d565b905092915050565b600060208201905081810360008301526144f98184614117565b905092915050565b6000602082019050818103600083015261451a81614218565b9050919050565b6000602082019050818103600083015261453a8161424f565b9050919050565b6000602082019050818103600083015261455a81614286565b9050919050565b6000602082019050818103600083015261457a816142bd565b9050919050565b6000602082019050818103600083015261459a816142f4565b9050919050565b600060208201905081810360008301526145ba8161432b565b9050919050565b60006020820190506145d66000830184614362565b92915050565b6000604051905081810181811067ffffffffffffffff821117156145ff57600080fd5b8060405250919050565b600067ffffffffffffffff82111561462057600080fd5b602082029050919050565b600067ffffffffffffffff82111561464257600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b60008160005260206000209050919050565b600060049050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000614722826146a1565b9050919050565b82818337600083830152505050565b60005b8381101561475657808201518184015260208101905061473b565b83811115614765576000848401525b50505050565b6000601f19601f8301169050919050565b6060600080836c0100000000000000000000000002915060146040519080825280601f01601f1916602001820160405280156147c75781602001602082028038833980820191505090505b509250600090505b60148110156148545781816014811015156147e657fe5b1a7f010000000000000000000000000000000000000000000000000000000000000002838281518110151561481757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506147cf565b50509190505600a265627a7a7230582009a101cf79cdbafb71f28b3b503f9afc04fd22864950dae5878f9de4c735b2fb6c6578706572696d656e74616cf50037"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":true,\"inputs\":[],\"name\":\"ROLE_R\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPENING_BANK\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ROLE_W\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"DATA\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateNonce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"BALANCE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"insert\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"RECORD\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"PUB_KEY\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADMIN\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODE_R\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_ADMIN\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"add\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOrg\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MODE_W\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"remove\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OWNER_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ASSETS\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"USER_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"removeWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"USER\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"getWithSign\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"size\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPERATOR\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ROLE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"set\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"addWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADMIN_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAccountManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ID\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE_PUBLIC\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"OPERATOR_ADDR\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"TYPE\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAuthCenter\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getAuthManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"insertWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNonce\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"}],\"name\":\"get\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"bytes\"},{\"name\":\"value\",\"type\":\"bytes\"},{\"name\":\"sign\",\"type\":\"bytes32[4]\"}],\"name\":\"setWithSign\",\"outputs\":[{\"name\":\"replaced\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"KEY_ALL\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"authCenterAddr\",\"type\":\"address\"},{\"name\":\"orgAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_ROLE_R = "ROLE_R";

    public static final String FUNC_OPENING_BANK = "OPENING_BANK";

    public static final String FUNC_ROLE_W = "ROLE_W";

    public static final String FUNC_DATA = "DATA";

    public static final String FUNC_UPDATENONCE = "updateNonce";

    public static final String FUNC_OWNER = "OWNER";

    public static final String FUNC_BALANCE = "BALANCE";

    public static final String FUNC_INSERT = "insert";

    public static final String FUNC_RECORD = "RECORD";

    public static final String FUNC_PUB_KEY = "PUB_KEY";

    public static final String FUNC_ADMIN = "ADMIN";

    public static final String FUNC_MODE_R = "MODE_R";

    public static final String FUNC_TYPE_ADMIN = "TYPE_ADMIN";

    public static final String FUNC_TYPE_OWNER = "TYPE_OWNER";

    public static final String FUNC_ADD = "add";

    public static final String FUNC_GETORG = "getOrg";

    public static final String FUNC_MODE_W = "MODE_W";

    public static final String FUNC_REMOVE = "remove";

    public static final String FUNC_OWNER_ADDR = "OWNER_ADDR";

    public static final String FUNC_ASSETS = "ASSETS";

    public static final String FUNC_USER_ADDR = "USER_ADDR";

    public static final String FUNC_REMOVEWITHSIGN = "removeWithSign";

    public static final String FUNC_USER = "USER";

    public static final String FUNC_GETWITHSIGN = "getWithSign";

    public static final String FUNC_SIZE = "size";

    public static final String FUNC_OPERATOR = "OPERATOR";

    public static final String FUNC_ROLE = "ROLE";

    public static final String FUNC_SET = "set";

    public static final String FUNC_ADDWITHSIGN = "addWithSign";

    public static final String FUNC_ADMIN_ADDR = "ADMIN_ADDR";

    public static final String FUNC_GETACCOUNTMANAGER = "getAccountManager";

    public static final String FUNC_ID = "ID";

    public static final String FUNC_ADDR = "ADDR";

    public static final String FUNC_TYPE_PUBLIC = "TYPE_PUBLIC";

    public static final String FUNC_OPERATOR_ADDR = "OPERATOR_ADDR";

    public static final String FUNC_TYPE = "TYPE";

    public static final String FUNC_GETAUTHCENTER = "getAuthCenter";

    public static final String FUNC_GETAUTHMANAGER = "getAuthManager";

    public static final String FUNC_INSERTWITHSIGN = "insertWithSign";

    public static final String FUNC_GETNONCE = "getNonce";

    public static final String FUNC_GET = "get";

    public static final String FUNC_SETWITHSIGN = "setWithSign";

    public static final String FUNC_KEY_ALL = "KEY_ALL";

    protected Identity(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public byte[] ROLE_R() throws ContractException {
        final Function function = new Function(FUNC_ROLE_R, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] OPENING_BANK() throws ContractException {
        final Function function = new Function(FUNC_OPENING_BANK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ROLE_W() throws ContractException {
        final Function function = new Function(FUNC_ROLE_W, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] DATA() throws ContractException {
        final Function function = new Function(FUNC_DATA, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt updateNonce() {
        final Function function = new Function(
                FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void updateNonce(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUpdateNonce() {
        final Function function = new Function(
                FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<BigInteger> getUpdateNonceOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_UPDATENONCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<BigInteger>(

                (BigInteger) results.get(0).getValue()
                );
    }

    public byte[] OWNER() throws ContractException {
        final Function function = new Function(FUNC_OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] BALANCE() throws ContractException {
        final Function function = new Function(FUNC_BALANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt insert(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_INSERT, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void insert(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_INSERT, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForInsert(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_INSERT, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getInsertInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_INSERT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getInsertOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_INSERT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] RECORD() throws ContractException {
        final Function function = new Function(FUNC_RECORD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] PUB_KEY() throws ContractException {
        final Function function = new Function(FUNC_PUB_KEY, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ADMIN() throws ContractException {
        final Function function = new Function(FUNC_ADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] MODE_R() throws ContractException {
        final Function function = new Function(FUNC_MODE_R, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_ADMIN() throws ContractException {
        final Function function = new Function(FUNC_TYPE_ADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_OWNER() throws ContractException {
        final Function function = new Function(FUNC_TYPE_OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt add(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_ADD, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void add(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADD, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAdd(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_ADD, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getAddInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getAddOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADD, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String getOrg() throws ContractException {
        final Function function = new Function(FUNC_GETORG, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] MODE_W() throws ContractException {
        final Function function = new Function(FUNC_MODE_W, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt remove(byte[] key) {
        final Function function = new Function(
                FUNC_REMOVE, 
                Arrays.<Type>asList(new DynamicBytes(key)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void remove(byte[] key, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REMOVE, 
                Arrays.<Type>asList(new DynamicBytes(key)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRemove(byte[] key) {
        final Function function = new Function(
                FUNC_REMOVE, 
                Arrays.<Type>asList(new DynamicBytes(key)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<byte[]> getRemoveInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REMOVE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<byte[]>(

                (byte[]) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getRemoveOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REMOVE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String OWNER_ADDR() throws ContractException {
        final Function function = new Function(FUNC_OWNER_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] ASSETS() throws ContractException {
        final Function function = new Function(FUNC_ASSETS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String USER_ADDR() throws ContractException {
        final Function function = new Function(FUNC_USER_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt removeWithSign(byte[] key, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void removeWithSign(byte[] key, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRemoveWithSign(byte[] key, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], List<byte[]>> getRemoveWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                convertToNative((List<Bytes32>) results.get(1).getValue())
                );
    }

    public Tuple1<Boolean> getRemoveWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_REMOVEWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] USER() throws ContractException {
        final Function function = new Function(FUNC_USER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] getWithSign(byte[] key, List<byte[]> sign) throws ContractException {
        final Function function = new Function(FUNC_GETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public BigInteger size() throws ContractException {
        final Function function = new Function(FUNC_SIZE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public byte[] OPERATOR() throws ContractException {
        final Function function = new Function(FUNC_OPERATOR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ROLE() throws ContractException {
        final Function function = new Function(FUNC_ROLE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt set(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void set(byte[] key, byte[] value, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSet(byte[] key, byte[] value) {
        final Function function = new Function(
                FUNC_SET, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<byte[], byte[]> getSetInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<byte[], byte[]>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getSetOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SET, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt addWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addWithSign(byte[] key, byte[] value, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], List<byte[]>> getAddWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                convertToNative((List<Bytes32>) results.get(2).getValue())
                );
    }

    public Tuple1<Boolean> getAddWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String ADMIN_ADDR() throws ContractException {
        final Function function = new Function(FUNC_ADMIN_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public String getAccountManager() throws ContractException {
        final Function function = new Function(FUNC_GETACCOUNTMANAGER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] ID() throws ContractException {
        final Function function = new Function(FUNC_ID, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] ADDR() throws ContractException {
        final Function function = new Function(FUNC_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public byte[] TYPE_PUBLIC() throws ContractException {
        final Function function = new Function(FUNC_TYPE_PUBLIC, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String OPERATOR_ADDR() throws ContractException {
        final Function function = new Function(FUNC_OPERATOR_ADDR, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public byte[] TYPE() throws ContractException {
        final Function function = new Function(FUNC_TYPE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public String getAuthCenter() throws ContractException {
        final Function function = new Function(FUNC_GETAUTHCENTER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public String getAuthManager() throws ContractException {
        final Function function = new Function(FUNC_GETAUTHMANAGER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt insertWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void insertWithSign(byte[] key, byte[] value, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForInsertWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], List<byte[]>> getInsertWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                convertToNative((List<Bytes32>) results.get(2).getValue())
                );
    }

    public Tuple1<Boolean> getInsertWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_INSERTWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public BigInteger getNonce() throws ContractException {
        final Function function = new Function(FUNC_GETNONCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public byte[] get(byte[] key) throws ContractException {
        final Function function = new Function(FUNC_GET, 
                Arrays.<Type>asList(new DynamicBytes(key)),
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public TransactionReceipt setWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setWithSign(byte[] key, byte[] value, List<byte[]> sign, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetWithSign(byte[] key, byte[] value, List<byte[]> sign) {
        final Function function = new Function(
                FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(new DynamicBytes(key),
                new DynamicBytes(value),
                new StaticArray4<Bytes32>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(sign, Bytes32.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<byte[], byte[], List<byte[]>> getSetWithSignInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}, new TypeReference<DynamicBytes>() {}, new TypeReference<StaticArray4<Bytes32>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<byte[], byte[], List<byte[]>>(

                (byte[]) results.get(0).getValue(), 
                (byte[]) results.get(1).getValue(), 
                convertToNative((List<Bytes32>) results.get(2).getValue())
                );
    }

    public Tuple1<Boolean> getSetWithSignOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SETWITHSIGN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public byte[] KEY_ALL() throws ContractException {
        final Function function = new Function(FUNC_KEY_ALL, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicBytes>() {}));
        return executeCallWithSingleValueReturn(function, byte[].class);
    }

    public static Identity load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new Identity(contractAddress, client, credential);
    }

    public static Identity deploy(Client client, CryptoKeyPair credential, String authCenterAddr, String orgAddr) throws ContractException {
        String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.<Type>asList(new Address(authCenterAddr),
                new Address(orgAddr)));
        return deploy(Identity.class, client, credential, getBinary(client.getCryptoSuite()), encodedConstructor);
    }
}
